package org.test4j.module;

import java.lang.reflect.Method;

/**
 * ITest4JListener: Test4J测试生命周期监听
 *
 * @author wudarui
 */
public interface Test4JListener {
    /**
     * 加载后初始化, 只执行一次
     */
    default boolean init() {
        return true;
    }

    /**
     * 监听器名称
     *
     * @return
     */
    default String name() {
        return this.getClass().getSimpleName();
    }

    /**
     * 加载排序, 0表示无序
     *
     * @return
     */
    default int order() {
        return 0;
    }

    /**
     * 在所有 @BeforeClass执行之前
     *
     * @param testClass
     */
    void beforeAll(Class testClass);

    /**
     * 在退出测试类之后
     */
    void afterAll();

    void beforeMethod(Object target);

    void afterMethod();

    /**
     * 在 @Before @BeforeEach @BeforeTest 之后, 执行测试之前
     *
     * @param target
     * @param method
     */
    void beforeExecute(Object target, Method method);

    /**
     * 在 执行测试之后, @After @AfterEach @AfterTest 之前
     *
     * @param target
     * @param method
     * @param e
     */
    void afterExecute(Object target, Method method, Throwable e);
}